![]() |
![]() |
|
17.2.2 Festlegen eines Standardverzeichnisses
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dlgFileOpen.InitialDirectory = @"C:\MyProjects"; |
| dlgFileOpen.ShowDialog(); |
Wenn Sie keinen Wert festlegen, enthält die Eigenschaft einen Leerstring.
Eine fixe Pfadangabe wie im Beispiel zu codieren, wird fatale Folgen haben, wenn der angegebene Ordner auf dem Rechner des Anwenders nicht existiert. Besser ist es, den Pfad zu dem Ordner anzugeben, in dem sich die ausführbare Datei der aktuellen Anwendung befindet. Dazu wird im Programmcode der Rückgabewert der Methode StartUpPath der Klasse Application der Eigenschaft InitialDirectory zugewiesen:
| dlgFileOpen.InitialDirectory = Application.StartupPath; |
| dlgFileOpen.ShowDialog(); |
Möglicherweise benötigen Sie aber eine andere Pfadangabe, beispielsweise den Pfad zu einem systemspezifischen Verzeichnis. Um die notwendigen Informationen über die Umgebung der aktuellen Maschine zu erhalten, können Sie auf die Dienste der Klasse Environment der .NET-Klassenbibliothek zurückgreifen.
Die Klasse Environment ist im Namespace System definiert und veröffentlicht Eigenschaften und Methoden, die zum Abrufen von maschinenspezifischen Informationen nützlich sind, beispielsweise die statische Methode GetFolderPath, die den Pfad eines bestimmten Systemordners abruft:
| public static string GetFolderPath(Environment.SpecialFolder sf); |
Die Methode erwartet als Argument einen Wert der Enumeration Environment.SpecialFolder. Um eine Vorstellung davon zu bekommen, welche Systemordner durch Konstanten abgebildet werden, enthält die folgende Tabelle auszugsweise einige der in dieser Enumeration festgelegten Werte sowie deren Zuordnung. In der Spalte Rückgabewert finden die Standardinstallationsvorgaben Berücksichtigung, die in Abhängigkeit von der Installation variieren können. Um einen vollständigen Überblick über alle Mitglieder zu erhalten, sollten Sie in der .NET-Dokumentation nachsehen.
| Member | Rückgabewert (Standardinstallationsvorgabe) |
| CommonProgramFiles | C:\Programme\Gemeinsame Dateien |
|
History |
C:\Dokumente und Einstellungen\<User>\Lokale Einstellungen\Verlauf |
| Personal | C:\Dokumente und Einstellungen\<User>\Eigene Dateien |
| ProgramFiles | C:\Programme |
| Programs | C:\Dokumente und Einstellungen\ <User>\ Startmenü\ Programme |
| Recent | C:\Dokumente und Einstellungen\<User>\Recent |
| StartMenu | C:\Dokumente und Einstellungen\<User>\Startmenü |
| Startup | C:\Dokumente und Einstellungen\<User>\Startmenü\Programme\Autostart |
| System | C:\WINNT\System32 |
Möchten Sie das zu öffnende Standardverzeichnis auf den Ordner
| C:\Dokumente und Einstellungen\<User>\Eigene Dateien |
festlegen, muss die Anweisung dazu wie folgt lauten:
| dlgFileOpen.InitialDirectory = |
| Environment.GetFolderPath(Environment.SpecialFolder.Personal) |
Zwei weitere statische Methoden der Klasse Environment liefern Informationen zu den Umgebungsvariablen: Die Methode GetEnvironmentVariable gibt den Inhalt einer bestimmten Umgebungsvariablen als Zeichenfolge zurück und die Methode GetEnvironmentVariables eine Auflistung vom Typ IDictionary, in der alle Umgebungsvariablen einschließlich ihrer Werte enthalten sind.
| public static IDictionary GetEnvironmentVariables(); |
| public static string GetEnvironmentVariable(string variable); |
Den Einsatz der Methode GetEnvironmentVariables sehen Sie im folgenden Codefragment, das in einer Listbox alle Umgebungsvariablen samt deren Werte ausgibt.
| IDictionary liste = Environment.GetEnvironmentVariables(); |
| foreach(DictionaryEntry temp in liste) |
| listBox1.Items.Add(temp.Key.ToString() + " = " + temp.Value.ToString()); |
Die Liste der statischen Eigenschaften der Klasse Environment enthält unter anderem mit SystemDirectory und CurrentDirectory zwei Eigenschaften, deren Rückgabewert wir auch über andere Methoden erhalten. SystemDirectory hat denselben Rückgabewert wie die Methode GetFolderPath, der das Argument Environment.SpecialFolder.System übergeben wird, während CurrentDirectory identisch mit Application.StartupPath ist.
Kehren wir nach unserem kleinen Ausflug zum Steuerelement OpenFileDialog zurück. Dessen Eigenschaft Filter legt die Dateitypen fest, die dem Anwender aus dem angezeigten Ordner zum Öffnen angeboten werden, z.B.:
| dlgFileOpen.Filter = "Textdateien (*.txt)|*.txt"; |
Welche Dateitypen gefiltert werden, kann der Anwender durch eine entsprechende Auswahl in einem Kombinationslistenfeld unterhalb des Anzeigebereichs bestimmen.
Die durch die Eigenschaft Filter beschriebene Zeichenfolge unterliegt einem strengen Muster. Die Anweisung oben definiert einen Dateifilter, der im Auswahlbereich des Dialogs nur Textdateien mit der Dateierweiterung .txt angeboten wird.
Die Zeichenfolge zur Festlegung eines Filters setzt sich immer aus zwei Teilen zusammen, die durch einen senkrechten Strich voneinander getrennt werden. Die Teilzeichenfolge links vom Strich wird dem Benutzer im Kombinationslistenfeld Dateityp angezeigt, die rechts vom Strich stehende Teilzeichenfolge ist die Anweisung an den Dialog, nach welchen Kriterien die Dateien gefiltert werden sollen. Das »*«-Zeichen dient als Platzhalter. Das Ergebnis der Anweisung sehen Sie in Abbildung 17.2.

Hier klicken, um das Bild zu vergrößern
Abbildung 17.2 Die »Filter«-Option von »OpenFileDialog«
Soll das Kombinationslistenfeld mehrere Auswahloptionen anbieten, ergänzen Sie die Zeichenfolge der Filter-Eigenschaft nach dem bekannten Muster um die gewünschten Dateien. Zur Abgrenzung untereinander verwenden Sie ebenfalls einen senkrechten Strich.
Im folgenden Beispiel wird das Kombinationslistenfeld mit zwei Einträgen gefüllt: Der erste ist die Filterung nach Textdateien, die zweite Auswahloption zeigt sämtliche Dateien des geöffneten Ordners an.
| dlgFileOpen.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*"; |
Wird zur Laufzeit der Anwendung die erste Auswahl getroffen, werden die TXT-Dateien herausgefiltert; entscheidet sich der Anwender für die zweite, werden alle Dateien, unabhängig von der Dateierweiterung, angezeigt.
Die im Kombinationslistenfeld angebotene Liste kann durchaus sehr lang werden, wenn Sie den Anwender mit vielen Filteroptionen verwöhnen wollen.
| string strFilter = "Textdateien (*.txt)|*.txt| HTML-Dateien|*.htm;*.html|" |
| + "Bitmap-Dateien (*.bmp)|*.bmp|" |
| + "Ausführbare Dateien (*.exe)|*.exe|" |
| + "Word-Dokumente(*.doc)|*.doc|" |
| + "Alle Dateien (*.*)|*.*)"; |
| dlgFileOpen.Filter = strFilter; |
| dlgFileOpen.ShowDialog(); |
Manchmal möchte man auch mehrere Dateitypen gleichzeitig anzeigen lassen. Das ist beispielsweise der Fall, wenn Sie nach mehreren Bildformaten filtern wollen. Listen Sie dazu in der rechten Teilzeichenfolge alle gewünschten Dateiformate auf. Diese müssen durch ein Semikolon voneinander getrennt werden:
| dlgFileOpen.Filter = "Alle Bilddateien|*.bmp;*.jpeg;*.gif"; |
Normalerweise wird nach dem Öffnen des Dialogs der zuerst aufgeführte Filter im Kombinationslistenfeld angezeigt. Mit der Eigenschaft FilterIndex kann aber auch ein beliebiger aus der Liste gewählt werden:
| dlgFileOpen.FilterIndex = 1; |
Entgegen den sonst üblichen Gepflogenheiten beginnt die Indizierung der Filter nicht mit dem Index 0, sondern mit dem Index 1. Sollen nach dem Öffnen des Dialogs beispielsweise nach den im angezeigten Verzeichnis befindlichen Word-Dokumenten gefiltert werden (siehe Codefragment oben), muss der Eigenschaft FilterIndex die Zahl 5 übergeben werden.
Sie wissen nun, wie Sie das Dialogfenster zum Öffnen einer Datei durch verschiedene Eigenschaften anforderungsgerecht gestalten können, aber der wichtigsten Eigenschaft des Dialogs OpenFileDialog haben wir bisher noch keine Beachtung geschenkt. Letztendlich ist es das Ziel, eine Datei auszuwählen und die Wahl im weiteren Programmcode zum tatsächlichen Öffnen der Datei zu verwenden. Die Eigenschaft, die uns den Dateinamen einschließlich der gesamten Pfadangabe liefert, ist FileName. Den Rückgabewert können wir als Übergabeargument bei der Instanziierung einer Klasse aus dem Namespace System.IO mit einem Konstruktor, der einen path-Parameter entgegennimmt, benutzen. z.B.:
| OpenFileDialog dlgFileOpen = new OpenFileDialog(); |
| if(dlgFileOpen.ShowDialog() == DialogResult.OK) |
| StreamReader sr = new StreamReader(ofd.FileName); |
| ... |
Selten sind Dialoge zum Öffnen einer Datei anzutreffen, die eine Mehrfachauswahl zulassen. Wollen Sie in Ihrer Anwendung trotzdem mit dieser Besonderheit aufwarten, müssen Sie die Eigenschaft MultiSelect des Dialogs im Programmcode oder im Eigenschaftsfenster auf true setzen. Das Verhalten bei der Dateiauswahl entspricht dann dem eines Listenfeldes mit erweiterter Mehrfachauswahl.
Bei einer einfachen Auswahlmöglichkeit kann man den Pfad zu der zu öffnenden Datei über die Eigenschaft FileName abfragen, bei der Mehrfachauswahl steht mit FileNames eine ähnlich lautende Eigenschaft zur Verfügung, deren Rückgabewert ein Array vom Typ string ist:
| public string[] FileNames {get;} |
Im Gegensatz zu FileName ist diese Eigenschaft schreibgeschützt.
| Member | Beschreibung |
| FileName | Ruft eine Zeichenfolge ab, die den im Dialog ausgewählten Dateinamen enthält, oder legt diese fest. |
| FileNames | Ruft die Dateinamen aller im Dialog ausgewählten Dateien ab. |
| Filter | Legt die aktuelle Filterzeichenfolge für die Dateitypen fest, die im Kombinationslistenfeld Dateityp angeboten werden. |
| FilterIndex | Ruft den Index des derzeit im Dialog ausgewählten Filters ab oder legt diesen fest. |
| InitialDirectory | Ruft das Ausgangsverzeichnis ab, das im Dialog angezeigt wird, oder legt dieses fest. |
| MultiSelect | Ruft einen Wert ab, der angibt, ob im Dialog mehrere Dateien ausgewählt werden können, oder legt diesen fest. |
| ShowHelp | Ruft einen Wert ab, der angibt, ob im Dialog die Hilfe-Schaltfläche angezeigt wird, oder legt diesen fest. |
| ShowReadOnly | Ruft einen Wert ab, der angibt, ob der Dialog ein Kontrollkästchen Schreib-geschützt öffnen enthält, oder legt diesen fest. |
| Title | Ruft die Titelleistenzeichenfolge des Dialogs ab oder legt diesen fest. |
| ShowDialog | (Methode) Zeigt das Standarddialogfeld an. |
Nur zwei spezifische Ereignisse zeichnen das Dialogfeld aus. Zum einen können Sie in Verbindung mit dem Klicken auf die Schaltfläche OK einen Ereignishandler mit dem Ereignis FileOK verknüpfen. Anstatt die Rückgabe des Aufrufs der Methode ShowDialog auszuwerten, können Sie somit auch im Ereignishandler auf die Dateiauswahl im Dialog reagieren. Unter bestimmten Umständen ist das Auswerten des Ereignisses FileOk flexibler, denn der Ereignishandler empfängt ein Argument vom Typ CancelEventArgs, das uns erlaubt, über die Eigenschaft Cancel das Schließen des Dialogs zu verhindern. Dadurch wird es dem Anwender möglich, mehrere Dateien einzeln hintereinander auszuwählen, ohne dass der Dialog wiederholt geöffnet werden muss.
Das Ereignis HelpRequest setzt voraus, dass die Eigenschaft ShowHelp=true gesetzt ist und im Dialog eine Hilfe-Schaltfläche angezeigt wird. Ausgelöst wird dieses Ereignis durch Klicken dieser Schaltfläche.
Im folgenden Beispiel wollen wir einen einfachen Texteditor entwickeln und für die allgemeinen Operationen zum Öffnen und Speichern Standarddialoge benutzen. Zunächst soll nur das Öffnen von Dateien implementiert werden. Später wird das Beispiel auch um die Speicherung der Dokumentinformationen ergänzt.
Die Form des Texteditors enthält eine Textbox, die auch dann den gesamten Clientbereich der Form ausfüllt, wenn die Form zur Laufzeit vergrößert oder verkleinert wird. Am einfachsten ist das zu realisieren, wenn die Eigenschaft Dock der Textbox auf DockStyle.Fill eingestellt wird. Das Formular enthält ein Menü mit dem Hauptmenüpunkt Datei und den Menüunterelementen Öffnen, Neu, Speichern, Speichern unter und Beenden.
Mit dem Erstellen eines Menüs werden wir uns im Kapitel 18 beschäftigen. Im Moment ist es für Sie nur wichtig zu wissen, dass ein Menüelement das Ereignis Click bereitstellt, das ausgelöst wird, sobald der Anwender einen Menüpunkt auswählt.

Hier klicken, um das Bild zu vergrößern
Abbildung 17.3 Formular des Beispiels »TexteditorVers1«
| // -------------------------------------------------------------- |
| // Beispiel: ...\Kapitel 17\TexteditorVers1 |
| // -------------------------------------------------------------- |
| // Ereignishandler des Click-Ereignisses des Menüs 'Öffnen' |
| private void mnuOeffnen_Click(object sender, EventArgs e) { |
| // Standarddialog zum Öffnen anzeigen |
| OpenFileDialog ofd = new OpenFileDialog(); |
| ofd.Filter = "Textdateien (*.txt)|*.txt|" |
| + "Alle Dateien (*.*)|*.*"; |
| ofd.Title = "Öffnen einer Textdatei"; |
| if (ofd.ShowDialog() == DialogResult.OK) { |
| // falls ein Fehler auftreten sollte, muss dieser behandelt werden |
| try { |
| StreamReader sr = new StreamReader(ofd.FileName); |
| txtDatei.Text = sr.ReadToEnd(); |
| sr.Close(); |
| } |
| catch(Exception ex) { |
| MessageBox.Show(ex.Message, "Texteditor"); |
| } |
| } |
| } |
| // Ereignishandler des Click-Ereignisses des Menüs 'Beenden' |
| private void mnuBeenden_Click(object sender, EventArgs e) { |
| string strMeldung = "Wollen Sie die Anwendung beenden?"; |
| DialogResult result = MessageBox.Show(strMeldung, |
| Application.ProductName, |
| MessageBoxButtons.OKCancel, |
| MessageBoxIcon.Question, |
| MessageBoxDefaultButton.Button2); |
| if(result == DialogResult.OK) |
| Application.Exit(); |
| } |
| // Ereignishandler des Click-Ereignisses des Menüs 'Neu' |
| private void mnuNeu_Click(object sender, EventArgs e) { |
| txtDatei.Text = ""; |
| } |
Im Zusammenhang mit dem Thema dieses Abschnitts ist der wichtigste Codeabschnitt der Dialog zum Öffnen einer Textdatei:
| OpenFileDialog ofd = new OpenFileDialog(); |
| ... |
| if (ofd.ShowDialog() == DialogResult.OK) { ... } |
Wie alle modalen Dialogfenster liefert der Aufruf der Methode ShowDialog einen Rückgabewert vom Typ DialogResult. Wir müssen nur noch feststellen, welche Schaltfläche der Anwender im Dialog geklickt hat, denn nur mit der Bestätigung durch OK soll die markierte Datei auch geöffnet und im Textfenster angezeigt werden.
Eine Textdatei kann mit mehreren Klassen des Namespace System.IO realisiert werden. Im Beispiel wird die Klasse StreamReader eingesetzt und dem Konstruktor die Eigenschaft FileName des Dialogs zugewiesen. Die Methode ReadToEnd liest von der aktuellen Position des Dateizeigers bis zum Ende der Datei ein und berücksichtigt dabei auch Zeilenumbrüche innerhalb des Textes. Der eingelesene Dateiinhalt wird in der Textbox angezeigt und anschließend das StreamReader-Objekt ordnungsgemäß geschlossen.
| StreamReader sr = new StreamReader(ofd.FileName); |
| txtDatei.Text = sr.ReadToEnd(); |
| sr.Close(); |
Da insbesondere Dateioperationen schnell einen Fehler verursachen können, wird das Öffnen und Einlesen in einem try-Anweisungblock eingeschlossen. Sollte eine Ausnahme auftreten, wird die Fehlermeldung in einem Meldungsfenster angezeigt.
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.